МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
ДЕРЖАВНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Побудова охоронних систем з GSM-сигналізацією на
AVR-мікроконтролерах
Лабораторна робота № 4
З курсу «Мікропроцесорні пристрої»
Львів 2010
Мета роботи – ознайомитись з принципами побудови охоронних систем з GSM-сигналізацією та їх програмно-апаратною реалізацією на AVR мікроконтролерах.
ЗАВДАННЯ
Домашня підготовка до роботи
1.Вивчити теоретичний матеріал.
2.Вивчити основні властивості МК необхідні для виконання лабораторної роботи.
3.Підготувати програму функціонування охоронної системи
Виконати в лабораторії
1.Створити проект в CodeVisionAVR, ввести свою програму, провести її компілювання.
2.В режимі покрокової відладки переконатися в правильності роботи програми.
3.Відкрити файл-схему у програмі Proteus, підключити до МК hex-файл.
4.Запустити режим симуляції схеми та перевірити правильність функціонування охоронної системи у всіх режимах роботи.
ТЕКСТ ПРОГРАМИ
#include <90S2313.h>
#include <delay.h>
#include <stdio.h>
#include <string.h>
// Мигання світлодіода під час охорони об'єкта
const unsigned int tBlick = 1000/1.5/50;
// Мигання світлодіода під час тривоги
const unsigned int tAlarm = 1000/20;
unsigned char D_Type1; // тип 1 давача 0 - не викор., 1 - НРЗ, 2 - НЗ
unsigned char D_Type2; // тип 2 давача 0 - не викор., 1 - НРЗ, 2 - НЗ
unsigned char z1_Time;
unsigned char z2_Time;
unsigned char buf[40]; // Буфер для читання та запису АТ-команд у модем
unsigned char pos; // Позиція кінця рядка в буфері
unsigned char admin_no[17]; // номер адміністратора безпеки
unsigned char NoError; // не рівне 0 якщо АТ команда повернула "OK"
// поступив новий байт даних через UART
interrupt[UART_RXC] void UART_Read()
{
// Ознака успішного виконання АТ команди
char *OK="OK";
buf[pos]=UDR, buf[++pos]=0;
NoError = *strstr(buf, OK);
}
void AT_Write(flash char *fStr)
{
register unsigned char i = 0;
SREG.7 = 0; // заборона переривань
putchar('A'), putchar('T'); // початок АТ команди
if(fStr) strcpyf(buf, fStr); // скопіювати команду в ОП
while(buf[i]) putchar(buf[i++]); // команда
putchar(0x0D); // завершення команди
buf[pos=0]=0; // обнулити буфер прийому
SREG.7 = 1; // дозвіл переривань
delay_ms(50); // затримка перед отриманням результату
}
// копіює входження символів, що мають визначений початок і кінець
void ExtractStr(char *to, char begin, char end, char *from)
{
*to=0; // обнуляємо вихідний рядок
// шукаємо початок
while(from && *from!=begin && *from) ++from;
++from;
// копіюємо до кінцевого символу
while(*from && *from!=end) *to++=*from++;
*to=0; // ознака закінчення рядка
}
// налаштування входів, передавача UART та
// зчитування загальних налаштувань з GSM модема
void Init()
{
SREG.7 = 1; // загальний дозвіл переривань
// налаштування входу кнопки
DDRB.0=0, PORTB.0=1;
// дозвіл перерив. чит., прийому передачі через UART
UCR.7 = UCR.3 = UCR.4 = 1;
// швидкість передачі 9600 бод
UBRR = 45;
// налаштування входів давачів
DDRD.4=0, PORTD.4=1; // вхід 1 НЗ
DDRB.1=0, PORTB.1=1; // вхід 2 НЗ
// налаштування виходу світлодіода
DDRB.3=1, PORTB.3=1;
}
// Ініціалізація модему та запит налаштувань
void InitGSM_Modem()
{
char tmp[10];
char first_sim[4];
// спробуємо завантажити налаштування з першої комірки сім катрки
// відключити режим "ехо"
AT_Write("E0");
// активна тел. книжка - сім картка
AT_Write("+CPBS=\"SM\"");
// вивести інформацію про тел. книжку
AT_Write("+CPBR=?");
// якщо помилка використовуємо відповідь по замовчуванню
if(!NoError) strcpyf(buf, "\r\n+CPBR: (501-700),40,14\r");
// скопіювати номер першої комірки в tmp
ExtractStr(first_sim, '(', '-', buf);
// запит на виведення першої комірки сім-картки
strcpyf(buf, "+CPBR="), strcat(buf, first_sim);
// вивести вміст першої комірки (містить налаштування)
AT_Write(0);
if(!NoError)// по замвч. всі давачі НЗ (2), ...